package com.meaningful.multithreading_and_concurrency.cpu_cache_effect;

import java.util.concurrent.TimeUnit;

/**
 * 由这个例子可见不同线程直接数据的读取【也可以说是线程之间的通信】
 * 受到CPU寄存器或CPU高速缓存的影响
 */
public class TestVolatile {

    // 与原子类一样，volatile不能保证完全的原子性，只能保证被修饰的属性具有单次的读/写操作具有原子性
    private static volatile boolean stop = false;

    public static void main(String[] args) {
        // 起一个线程不断的读stop
        new Thread("Read Thread A") {

            @Override
            public void run() {
                while (!stop) {
                    System.out.println(Thread.currentThread().getName() + ": " + "根本停不下来啊！！！！");
                }
                System.out.println(Thread.currentThread().getName() + ": " + "stopped");
            }

        }.start();

        // 主线程沉睡一秒
        try {
            TimeUnit.SECONDS.sleep(1);
            System.out.println(Thread.currentThread().getName() + ": " + "after 1 s");
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        stop = true;
        System.out.println("stop已经设置为true");
    }

}
